From fc01ce0756de1f918d973d937d1ea674bea50cd6 Mon Sep 17 00:00:00 2001 From: Federico Mena Quintero Date: Fri, 14 Dec 2012 17:56:53 -0600 Subject: [PATCH] Rebuild the popup menu every time it is used We'll need to rebuild it every time for the populate-popup signal. Signed-off-by: Federico Mena Quintero --- gtk/gtkplacessidebar.c | 187 +++++++++++++++++------------------------ 1 file changed, 76 insertions(+), 111 deletions(-) diff --git a/gtk/gtkplacessidebar.c b/gtk/gtkplacessidebar.c index 033fda0917..d5f95ed2b9 100644 --- a/gtk/gtkplacessidebar.c +++ b/gtk/gtkplacessidebar.c @@ -109,20 +109,6 @@ struct _GtkPlacesSidebar { gboolean drop_occured; GtkWidget *popup_menu; - GtkWidget *popup_menu_open_in_new_tab_item; - GtkWidget *popup_menu_add_shortcut_item; - GtkWidget *popup_menu_remove_item; - GtkWidget *popup_menu_rename_item; - GtkWidget *popup_menu_separator_item; - GtkWidget *popup_menu_mount_item; - GtkWidget *popup_menu_unmount_item; - GtkWidget *popup_menu_eject_item; - GtkWidget *popup_menu_rescan_item; - GtkWidget *popup_menu_empty_trash_item; - GtkWidget *popup_menu_start_item; - GtkWidget *popup_menu_stop_item; - GtkWidget *popup_menu_properties_separator_item; - GtkWidget *popup_menu_properties_item; /* volume mounting - delayed open process */ gboolean mounting; @@ -255,8 +241,6 @@ static void check_unmount_and_eject (GMount *mount, gboolean *show_unmount, gboolean *show_eject); -static void check_popup_sensitivity (GtkPlacesSidebar *sidebar); - /* Identifiers for target types */ enum { GTK_TREE_MODEL_ROW, @@ -1708,24 +1692,9 @@ bookmarks_popup_menu_detach_cb (GtkWidget *attach_widget, GtkPlacesSidebar *sidebar; sidebar = GTK_PLACES_SIDEBAR (attach_widget); - g_assert (GTK_IS_PLACES_SIDEBAR (sidebar)); sidebar->popup_menu = NULL; - sidebar->popup_menu_add_shortcut_item = NULL; - sidebar->popup_menu_remove_item = NULL; - sidebar->popup_menu_rename_item = NULL; - sidebar->popup_menu_separator_item = NULL; - sidebar->popup_menu_mount_item = NULL; - sidebar->popup_menu_unmount_item = NULL; - sidebar->popup_menu_eject_item = NULL; - sidebar->popup_menu_rescan_item = NULL; - sidebar->popup_menu_start_item = NULL; - sidebar->popup_menu_stop_item = NULL; - sidebar->popup_menu_empty_trash_item = NULL; - sidebar->popup_menu_properties_separator_item = NULL; - sidebar->popup_menu_properties_item = NULL; } - static void check_unmount_and_eject (GMount *mount, GVolume *volume, @@ -1786,8 +1755,25 @@ check_visibility (GMount *mount, } } +typedef struct { + GtkWidget *open_in_new_tab_item; + GtkWidget *add_shortcut_item; + GtkWidget *remove_item; + GtkWidget *rename_item; + GtkWidget *separator_item; + GtkWidget *mount_item; + GtkWidget *unmount_item; + GtkWidget *eject_item; + GtkWidget *rescan_item; + GtkWidget *empty_trash_item; + GtkWidget *start_item; + GtkWidget *stop_item; + GtkWidget *properties_separator_item; + GtkWidget *properties_item; +} PopupMenuData; + static void -check_popup_sensitivity (GtkPlacesSidebar *sidebar) +check_popup_sensitivity (GtkPlacesSidebar *sidebar, PopupMenuData *data) { GtkTreeIter iter; PlaceType type; @@ -1807,10 +1793,6 @@ check_popup_sensitivity (GtkPlacesSidebar *sidebar) type = PLACES_BUILT_IN; - if (sidebar->popup_menu == NULL) { - return; - } - if (get_selected_iter (sidebar, &iter)) { gtk_tree_model_get (GTK_TREE_MODEL (sidebar->store), &iter, PLACES_SIDEBAR_COLUMN_ROW_TYPE, &type, @@ -1821,11 +1803,11 @@ check_popup_sensitivity (GtkPlacesSidebar *sidebar) -1); } - gtk_widget_set_visible (sidebar->popup_menu_add_shortcut_item, (type == PLACES_MOUNTED_VOLUME)); + gtk_widget_set_visible (data->add_shortcut_item, (type == PLACES_MOUNTED_VOLUME)); - gtk_widget_set_sensitive (sidebar->popup_menu_remove_item, (type == PLACES_BOOKMARK)); - gtk_widget_set_sensitive (sidebar->popup_menu_rename_item, (type == PLACES_BOOKMARK)); - gtk_widget_set_sensitive (sidebar->popup_menu_empty_trash_item, sidebar->trash_is_full); + gtk_widget_set_sensitive (data->remove_item, (type == PLACES_BOOKMARK)); + gtk_widget_set_sensitive (data->rename_item, (type == PLACES_BOOKMARK)); + gtk_widget_set_sensitive (data->empty_trash_item, sidebar->trash_is_full); check_visibility (mount, volume, drive, &show_mount, &show_unmount, &show_eject, &show_rescan, &show_start, &show_stop); @@ -1847,40 +1829,40 @@ check_popup_sensitivity (GtkPlacesSidebar *sidebar) } else show_properties = FALSE; - gtk_widget_set_visible (sidebar->popup_menu_separator_item, + gtk_widget_set_visible (data->separator_item, show_mount || show_unmount || show_eject || show_empty_trash); - gtk_widget_set_visible (sidebar->popup_menu_mount_item, show_mount); - gtk_widget_set_visible (sidebar->popup_menu_unmount_item, show_unmount); - gtk_widget_set_visible (sidebar->popup_menu_eject_item, show_eject); - gtk_widget_set_visible (sidebar->popup_menu_rescan_item, show_rescan); - gtk_widget_set_visible (sidebar->popup_menu_start_item, show_start); - gtk_widget_set_visible (sidebar->popup_menu_stop_item, show_stop); - gtk_widget_set_visible (sidebar->popup_menu_empty_trash_item, show_empty_trash); - gtk_widget_set_visible (sidebar->popup_menu_properties_separator_item, show_properties); - gtk_widget_set_visible (sidebar->popup_menu_properties_item, show_properties); + gtk_widget_set_visible (data->mount_item, show_mount); + gtk_widget_set_visible (data->unmount_item, show_unmount); + gtk_widget_set_visible (data->eject_item, show_eject); + gtk_widget_set_visible (data->rescan_item, show_rescan); + gtk_widget_set_visible (data->start_item, show_start); + gtk_widget_set_visible (data->stop_item, show_stop); + gtk_widget_set_visible (data->empty_trash_item, show_empty_trash); + gtk_widget_set_visible (data->properties_separator_item, show_properties); + gtk_widget_set_visible (data->properties_item, show_properties); /* Adjust start/stop items to reflect the type of the drive */ - gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_start_item), _("_Start")); - gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_stop_item), _("_Stop")); + gtk_menu_item_set_label (GTK_MENU_ITEM (data->start_item), _("_Start")); + gtk_menu_item_set_label (GTK_MENU_ITEM (data->stop_item), _("_Stop")); if ((show_start || show_stop) && drive != NULL) { switch (g_drive_get_start_stop_type (drive)) { case G_DRIVE_START_STOP_TYPE_SHUTDOWN: /* start() for type G_DRIVE_START_STOP_TYPE_SHUTDOWN is normally not used */ - gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_start_item), _("_Power On")); - gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_stop_item), _("_Safely Remove Drive")); + gtk_menu_item_set_label (GTK_MENU_ITEM (data->start_item), _("_Power On")); + gtk_menu_item_set_label (GTK_MENU_ITEM (data->stop_item), _("_Safely Remove Drive")); break; case G_DRIVE_START_STOP_TYPE_NETWORK: - gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_start_item), _("_Connect Drive")); - gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_stop_item), _("_Disconnect Drive")); + gtk_menu_item_set_label (GTK_MENU_ITEM (data->start_item), _("_Connect Drive")); + gtk_menu_item_set_label (GTK_MENU_ITEM (data->stop_item), _("_Disconnect Drive")); break; case G_DRIVE_START_STOP_TYPE_MULTIDISK: - gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_start_item), _("_Start Multi-disk Device")); - gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_stop_item), _("_Stop Multi-disk Device")); + gtk_menu_item_set_label (GTK_MENU_ITEM (data->start_item), _("_Start Multi-disk Device")); + gtk_menu_item_set_label (GTK_MENU_ITEM (data->stop_item), _("_Stop Multi-disk Device")); break; case G_DRIVE_START_STOP_TYPE_PASSWORD: /* stop() for type G_DRIVE_START_STOP_TYPE_PASSWORD is normally not used */ - gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_start_item), _("_Unlock Drive")); - gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_stop_item), _("_Lock Drive")); + gtk_menu_item_set_label (GTK_MENU_ITEM (data->start_item), _("_Unlock Drive")); + gtk_menu_item_set_label (GTK_MENU_ITEM (data->stop_item), _("_Lock Drive")); break; default: @@ -1894,14 +1876,6 @@ check_popup_sensitivity (GtkPlacesSidebar *sidebar) g_free (uri); } -/* Callback used when the selection in the shortcuts tree changes */ -static void -bookmarks_selection_changed_cb (GtkTreeSelection *selection, - GtkPlacesSidebar *sidebar) -{ - check_popup_sensitivity (sidebar); -} - static void drive_start_from_bookmark_cb (GObject *source_object, GAsyncResult *res, @@ -2892,16 +2866,13 @@ append_menu_separator (GtkMenu *menu) static void bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar) { + PopupMenuData menu_data; GtkWidget *item; - if (sidebar->popup_menu) { - return; - } - sidebar->popup_menu = gtk_menu_new (); gtk_menu_attach_to_widget (GTK_MENU (sidebar->popup_menu), - GTK_WIDGET (sidebar), - bookmarks_popup_menu_detach_cb); + GTK_WIDGET (sidebar), + bookmarks_popup_menu_detach_cb); item = gtk_image_menu_item_new_with_mnemonic (_("_Open")); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), @@ -2912,7 +2883,7 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar) gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); item = gtk_menu_item_new_with_mnemonic (_("Open in New _Tab")); - sidebar->popup_menu_open_in_new_tab_item = item; + menu_data.open_in_new_tab_item = item; g_signal_connect (item, "activate", G_CALLBACK (open_shortcut_in_new_tab_cb), sidebar); gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); @@ -2933,68 +2904,68 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar) append_menu_separator (GTK_MENU (sidebar->popup_menu)); item = gtk_menu_item_new_with_mnemonic (_("_Add Bookmark")); - sidebar->popup_menu_add_shortcut_item = item; + menu_data.add_shortcut_item = item; g_signal_connect (item, "activate", G_CALLBACK (add_shortcut_cb), sidebar); gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); item = gtk_image_menu_item_new_with_label (_("Remove")); - sidebar->popup_menu_remove_item = item; + menu_data.remove_item = item; gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), - gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU)); + gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU)); g_signal_connect (item, "activate", - G_CALLBACK (remove_shortcut_cb), sidebar); + G_CALLBACK (remove_shortcut_cb), sidebar); gtk_widget_show (item); gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); item = gtk_menu_item_new_with_label (_("Rename…")); - sidebar->popup_menu_rename_item = item; + menu_data.rename_item = item; g_signal_connect (item, "activate", - G_CALLBACK (rename_shortcut_cb), sidebar); + G_CALLBACK (rename_shortcut_cb), sidebar); gtk_widget_show (item); gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); /* Mount/Unmount/Eject menu items */ - sidebar->popup_menu_separator_item = GTK_WIDGET (append_menu_separator (GTK_MENU (sidebar->popup_menu))); + menu_data.separator_item = GTK_WIDGET (append_menu_separator (GTK_MENU (sidebar->popup_menu))); item = gtk_menu_item_new_with_mnemonic (_("_Mount")); - sidebar->popup_menu_mount_item = item; + menu_data.mount_item = item; g_signal_connect (item, "activate", - G_CALLBACK (mount_shortcut_cb), sidebar); + G_CALLBACK (mount_shortcut_cb), sidebar); gtk_widget_show (item); gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); item = gtk_menu_item_new_with_mnemonic (_("_Unmount")); - sidebar->popup_menu_unmount_item = item; + menu_data.unmount_item = item; g_signal_connect (item, "activate", - G_CALLBACK (unmount_shortcut_cb), sidebar); + G_CALLBACK (unmount_shortcut_cb), sidebar); gtk_widget_show (item); gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); item = gtk_menu_item_new_with_mnemonic (_("_Eject")); - sidebar->popup_menu_eject_item = item; + menu_data.eject_item = item; g_signal_connect (item, "activate", - G_CALLBACK (eject_shortcut_cb), sidebar); + G_CALLBACK (eject_shortcut_cb), sidebar); gtk_widget_show (item); gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); item = gtk_menu_item_new_with_mnemonic (_("_Detect Media")); - sidebar->popup_menu_rescan_item = item; + menu_data.rescan_item = item; g_signal_connect (item, "activate", - G_CALLBACK (rescan_shortcut_cb), sidebar); + G_CALLBACK (rescan_shortcut_cb), sidebar); gtk_widget_show (item); gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); item = gtk_menu_item_new_with_mnemonic (_("_Start")); - sidebar->popup_menu_start_item = item; + menu_data.start_item = item; g_signal_connect (item, "activate", G_CALLBACK (start_shortcut_cb), sidebar); gtk_widget_show (item); gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); item = gtk_menu_item_new_with_mnemonic (_("_Stop")); - sidebar->popup_menu_stop_item = item; + menu_data.stop_item = item; g_signal_connect (item, "activate", G_CALLBACK (stop_shortcut_cb), sidebar); gtk_widget_show (item); @@ -3003,7 +2974,7 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar) /* Empty Trash menu item */ item = gtk_menu_item_new_with_mnemonic (_("Empty _Trash")); - sidebar->popup_menu_empty_trash_item = item; + menu_data.empty_trash_item = item; g_signal_connect (item, "activate", G_CALLBACK (empty_trash_cb), sidebar); gtk_widget_show (item); @@ -3011,10 +2982,10 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar) /* Properties menu item */ - sidebar->popup_menu_properties_separator_item = GTK_WIDGET (append_menu_separator (GTK_MENU (sidebar->popup_menu))); + menu_data.properties_separator_item = GTK_WIDGET (append_menu_separator (GTK_MENU (sidebar->popup_menu))); item = gtk_menu_item_new_with_mnemonic (_("_Properties")); - sidebar->popup_menu_properties_item = item; + menu_data.properties_item = item; g_signal_connect (item, "activate", G_CALLBACK (properties_cb), sidebar); gtk_widget_show (item); @@ -3022,13 +2993,7 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar) /* Update everything! */ - check_popup_sensitivity (sidebar); -} - -static void -bookmarks_update_popup_menu (GtkPlacesSidebar *sidebar) -{ - bookmarks_build_popup_menu (sidebar); + check_popup_sensitivity (sidebar, &menu_data); } static void @@ -3037,7 +3002,10 @@ bookmarks_popup_menu (GtkPlacesSidebar *sidebar, { int button; - bookmarks_update_popup_menu (sidebar); + if (sidebar->popup_menu) + gtk_widget_destroy (sidebar->popup_menu); + + bookmarks_build_popup_menu (sidebar); /* The event button needs to be 0 if we're popping up this menu from * a button release, else a 2nd click outside the menu with any button @@ -3060,8 +3028,6 @@ bookmarks_popup_menu (GtkPlacesSidebar *sidebar, NULL, /* popup_position_user_data */ button, /* button */ event ? event->time : gtk_get_current_event_time ()); /* activate_time */ - - g_object_ref_sink (sidebar->popup_menu); /* FIXME: is this right? It was gtk_object_sink() */ } /* Callback used for the GtkWidget::popup-menu signal of the shortcuts list */ @@ -3615,8 +3581,6 @@ gtk_places_sidebar_init (GtkPlacesSidebar *sidebar) g_signal_connect (tree_view, "drag-drop", G_CALLBACK (drag_drop_callback), sidebar); - g_signal_connect (selection, "changed", - G_CALLBACK (bookmarks_selection_changed_cb), sidebar); g_signal_connect (tree_view, "popup-menu", G_CALLBACK (bookmarks_popup_menu_cb), sidebar); g_signal_connect (tree_view, "button-release-event", @@ -3655,6 +3619,11 @@ gtk_places_sidebar_dispose (GObject *object) sidebar->bookmarks_manager = NULL; } + if (sidebar->popup_menu) { + gtk_widget_destroy (sidebar->popup_menu); + sidebar->popup_menu = NULL; + } + g_clear_object (&sidebar->store); g_slist_free_full (sidebar->shortcuts, g_object_unref); @@ -3966,7 +3935,6 @@ gtk_places_sidebar_set_multiple_tabs_supported (GtkPlacesSidebar *sidebar, gbool g_return_if_fail (GTK_IS_PLACES_SIDEBAR (sidebar)); sidebar->multiple_tabs_supported = !!supported; - bookmarks_popup_menu_detach_cb (GTK_WIDGET (sidebar), NULL); } /** @@ -3985,7 +3953,6 @@ gtk_places_sidebar_set_multiple_windows_supported (GtkPlacesSidebar *sidebar, gb g_return_if_fail (GTK_IS_PLACES_SIDEBAR (sidebar)); sidebar->multiple_windows_supported = !!supported; - bookmarks_popup_menu_detach_cb (GTK_WIDGET (sidebar), NULL); } /** @@ -4012,7 +3979,6 @@ gtk_places_sidebar_set_show_properties (GtkPlacesSidebar *sidebar, gboolean show g_return_if_fail (GTK_IS_PLACES_SIDEBAR (sidebar)); sidebar->show_properties = !!show_properties; - check_popup_sensitivity (sidebar); } void @@ -4031,7 +3997,6 @@ gtk_places_sidebar_set_trash_is_full (GtkPlacesSidebar *sidebar, gboolean is_ful sidebar->trash_is_full = !!is_full; update_places (sidebar); - check_popup_sensitivity (sidebar); } void -- 2.30.2